package br.com.monitorimoveis.comum.entidade;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;

@Entity
@Table(name="anuncio")
public class Anuncio {

	private int idAnuncio;
	private String localizacao;
	private int quartos;
	private int suites;
	private int vagas;
	private double areaUtil;
	private double preco;
	private double precoM2;
	private TipoAnuncio tipoAnuncio;
	private int codigo;
	private Date dataAtualizacao;
	//private String cidade;
	//private String bairro;
	private Bairro bairro;
	private TipoImovel tipoImovel;
	private int elevadores;
	private boolean pronto;
	private double precoCondominio;
	private String posicao;
	private String posicaoSol;
	private int andares;
	private boolean aceitaFinanciamento;
	private double precoAgio;
	private double areaTerreno;
	private double areaTotal;
	private int andar;
	private List<PrecoHistAnuncio> listaPrecoHistAnuncio;
	private String identificacao;
	private Date dataInclusao;
	private Date dataAlteracao;
	


	public Anuncio() {
	}
	
	public void atualizarCom(Anuncio maisAtual) {
		
		if (maisAtual.getPreco() != 0 && maisAtual.getPreco() != this.getPreco()) {
			System.out.println("Atualizando o preço...");
			PrecoHistAnuncio hist = new PrecoHistAnuncio();
			hist.setPreco(this.getPreco());
			hist.setData(this.getDataAtualizacao());
			hist.setAnuncio(this);
			
			List<PrecoHistAnuncio> historico = this.getListaPrecoHistAnuncio();
			if (historico == null) {
			    historico = new ArrayList<PrecoHistAnuncio>();
			}
			historico.add(hist);
			this.setPreco(maisAtual.getPreco());

		}
		this.setDataAtualizacao(maisAtual.getDataAtualizacao());
		this.setAceitaFinanciamento(maisAtual.isAceitaFinanciamento());
		this.setAndar(maisAtual.getAndar());
		this.setAndares(maisAtual.getAndares());
		this.setAreaTerreno(maisAtual.getAreaTerreno());
		this.setAreaTotal(maisAtual.getAreaTotal());
		this.setAreaUtil(maisAtual.getAreaUtil());
		this.setBairro(maisAtual.getBairro());
		//this.setCidade(maisAtual.getCidade());
		this.setElevadores(maisAtual.getElevadores());
		this.setLocalizacao(maisAtual.getLocalizacao());
		this.setPosicao(maisAtual.getPosicao());
		this.setPosicaoSol(maisAtual.getPosicaoSol());
		this.setPrecoAgio(maisAtual.getPrecoAgio());
		this.setPrecoCondominio(maisAtual.getPrecoCondominio());
		this.setPrecoM2(maisAtual.getPrecoM2());
		this.setPronto(maisAtual.isPronto());
		this.setQuartos(maisAtual.getQuartos());
		this.setSuites(maisAtual.getSuites());
		this.setTipoAnuncio(maisAtual.getTipoAnuncio());
		this.setTipoImovel(maisAtual.getTipoImovel());
		this.setVagas(maisAtual.getVagas());
		this.setIdentificacao(maisAtual.getIdentificacao());

	}

	public String toString() {
		StringBuffer sb = new StringBuffer("\n");

		sb.append("Identificacao=" + identificacao);
		sb.append(", localização=" + localizacao);
		sb.append(", quartos=" + quartos);
		sb.append(", suites=" + suites);
		sb.append(", vagas=" + vagas);
		sb.append(", elevadores=" + elevadores);
		sb.append(", areaUtil=" + areaUtil);
		sb.append(", valor=" + preco);
		sb.append(", valorM2=" + precoM2);
		sb.append(", tipoAnuncio=" + tipoAnuncio);
		sb.append(", codigo=" + codigo);
		sb.append(", atualizacao=" + dataAtualizacao);
		//sb.append(", cidade=" + cidade);
		sb.append(", bairro=" + bairro.getNome());
		sb.append(", tipoImovel=" + tipoImovel);
		sb.append(", pronto=" + (pronto == true ? "Sim" : "Não"));
		sb.append(", condominio=" + precoCondominio);
		sb.append(", posicao=" + posicao);
		sb.append(", posicaoSol=" + posicaoSol);
		sb.append(", andar=" + andar);
		sb.append(", andares=" + andares);
		sb.append(", aceitaFinanceamento=" + (aceitaFinanciamento == true ? "Sim" : "Não"));
		sb.append(", valorAgio=" + precoAgio);
		sb.append(", areaTerreno=" + areaTerreno);
		sb.append(", areaTotal=" + areaTotal);
		sb.append(", dataInclusao=" + dataInclusao);
		sb.append(", dataAlteracao=" + dataAlteracao);
		
		return sb.toString();
	}

	@Column
	public String getLocalizacao() {
		return localizacao;
	}

	public void setLocalizacao(String localizacao) {
		this.localizacao = localizacao;
	}

	@Column
	public int getQuartos() {
		return quartos;
	}

	public void setQuartos(int quartos) {
		this.quartos = quartos;
	}

	@Column
	public int getSuites() {
		return suites;
	}

	public void setSuites(int suites) {
		this.suites = suites;
	}

	@Column
	public int getVagas() {
		return vagas;
	}

	public void setVagas(int vagas) {
		this.vagas = vagas;
	}

	@Column
	public double getAreaUtil() {
		return areaUtil;
	}

	public void setAreaUtil(double areaUtil) {
		this.areaUtil = areaUtil;
	}

	@Column
	public double getPreco() {
		return preco;
	}

	public void setPreco(double preco) {
		this.preco = preco;
	}

	@Column
	public double getPrecoM2() {
		return precoM2;
	}

	public void setPrecoM2(double precoM2) {
		this.precoM2 = precoM2;
	}

	@ManyToOne
	@JoinColumn(name="id_tipo_anuncio", referencedColumnName="id_tipo_anuncio")
	public TipoAnuncio getTipoAnuncio() {
		return tipoAnuncio;
	}

	public void setTipoAnuncio(TipoAnuncio tipoAnuncio) {
		this.tipoAnuncio = tipoAnuncio;
	}

	@Column
	public int getCodigo() {
		return codigo;
	}

	public void setCodigo(int codigo) {
		this.codigo = codigo;
	}

	@Column
	public Date getDataAtualizacao() {
		return dataAtualizacao;
	}

	public void setDataAtualizacao(Date dataAtualizacao) {
		this.dataAtualizacao = dataAtualizacao;
	}

//	@Column
//	public String getCidade() {
//		return cidade;
//	}
//
//	public void setCidade(String cidade) {
//		this.cidade = cidade;
//	}

	@ManyToOne
	@JoinColumn(name="id_bairro", referencedColumnName="id_bairro")
	public Bairro getBairro() {
		return bairro;
	}

	public void setBairro(Bairro bairro) {
		this.bairro = bairro;
	}

	@ManyToOne
	@JoinColumn(name="id_tipo_imovel", referencedColumnName="id_tipo_imovel")
	public TipoImovel getTipoImovel() {
		return tipoImovel;
	}

	public void setTipoImovel(TipoImovel tipoImovel) {
		this.tipoImovel = tipoImovel;
	}

	@Column
	public int getElevadores() {
		return elevadores;
	}

	public void setElevadores(int elevadores) {
		this.elevadores = elevadores;
	}

	@Column
	public boolean isPronto() {
		return pronto;
	}

	public void setPronto(boolean pronto) {
		this.pronto = pronto;
	}

	@Column
	public double getPrecoCondominio() {
		return precoCondominio;
	}

	public void setPrecoCondominio(double precoCondominio) {
		this.precoCondominio = precoCondominio;
	}

	@Column
	public String getPosicao() {
		return posicao;
	}

	public void setPosicao(String posicao) {
		this.posicao = posicao;
	}

	@Column
	public String getPosicaoSol() {
		return posicaoSol;
	}

	public void setPosicaoSol(String posicaoSol) {
		this.posicaoSol = posicaoSol;
	}

	@Column
	public int getAndares() {
		return andares;
	}

	public void setAndares(int andares) {
		this.andares = andares;
	}

	@Column
	public boolean isAceitaFinanciamento() {
		return aceitaFinanciamento;
	}

	public void setAceitaFinanciamento(boolean aceitaFinanciamento) {
		this.aceitaFinanciamento = aceitaFinanciamento;
	}

	@Column
	public double getPrecoAgio() {
		return precoAgio;
	}

	public void setPrecoAgio(double precoAgio) {
		this.precoAgio = precoAgio;
	}
	
	@Column
	public double getAreaTerreno() {
		return areaTerreno;
	}

	public void setAreaTerreno(double areaTerreno) {
		this.areaTerreno = areaTerreno;
	}
	
	@Column
	public double getAreaTotal() {
		return areaTotal;
	}

	public void setAreaTotal(double areaTotal) {
		this.areaTotal = areaTotal;
	}

	@Column
	public int getAndar() {
		return andar;
	}

	public void setAndar(int andar) {
		this.andar = andar;
	}


	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "idAnuncio", nullable = false)
	public int getIdAnuncio() {
		return idAnuncio;
	}

	public void setIdAnuncio(int idAnuncio) {
		this.idAnuncio = idAnuncio;
	}

	@OneToMany(fetch = FetchType.EAGER, mappedBy = "anuncio")
	@Cascade(CascadeType.ALL)
	public List<PrecoHistAnuncio> getListaPrecoHistAnuncio() {
		return listaPrecoHistAnuncio;
	}

	public void setListaPrecoHistAnuncio(
			List<PrecoHistAnuncio> listaPrecoHistAnuncio) {
		this.listaPrecoHistAnuncio = listaPrecoHistAnuncio;
	}

	@Column
	public String getIdentificacao() {
		return identificacao;
	}

	public void setIdentificacao(String identificacao) {
		this.identificacao = identificacao;
	}

	@Column
	public Date getDataInclusao() {
		return dataInclusao;
	}

	public void setDataInclusao(Date dataInclusao) {
		this.dataInclusao = dataInclusao;
	}

	@Column
	public Date getDataAlteracao() {
		return dataAlteracao;
	}

	public void setDataAlteracao(Date dataAlteracao) {
		this.dataAlteracao = dataAlteracao;
	}
	
}
